<?php

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of ObjectCratorsController
 *
 * @author wilavel
 */
class ObjectCreatorsController extends AppController {

//put your code here
    public $name = "ObjectCreators";

    function index() {
        $this->layout="registered";
        $objetos = App::objects('model');
        $this->set('objetos', $objetos);
    }

    function actions_index($model_name) {
        $this->layout="registered";
        $nombreArchivo = Inflector::camelize(Inflector::pluralize($model_name));
        $this->set("objeto", $model_name);

// var_dump($rutaControllers);
        $nombreArchivo = $nombreArchivo . "Controller";
        $rutaArchivo = APP . "Controller" . DS . $nombreArchivo . ".php";
        if (file_exists($rutaArchivo)) {

            $texto = "";
            $fp = fopen($rutaArchivo, 'r') or die("No se pudo abrir el archivo");
            while ($linea = fgets($fp, 1024)) {
                $texto.=$linea;
            }
            $texto = str_replace("<?php", "", $texto);
            $texto = str_replace("?>", "", $texto);

            $funciones = explode("function ", $texto);
            $this->set('funciones', $funciones);
        } else {
            
        }
    }

    function tablesIndex() {
        $this->layout="registered";
        $this->ObjectCreator->recursive = -1;
        //$tablas = $this->ObjectCreator->query("SHOW TABLES");
        $objetos = App::objects('model');
        $db = ConnectionManager::getDataSource('default');
        $tablas = $db->listSources();
        $posibles = array();
        foreach ($tablas as $tabla) {
            $posibles[] = Inflector::camelize(Inflector::singularize($tabla));
        };

        $this->set('posiblesObjetos', array_diff($posibles, $objetos));
    }

    function add($objeto) {
        $this->layout="registered";

        $this->set('objeto', $objeto);
        if (empty($this->data)) {
            $tabla = Inflector::pluralize(Inflector::underscore($objeto));
            $relaciones = array();
            $campos = $tablas = $this->ObjectCreator->query("DESCRIBE $tabla");

            foreach ($campos as $campo) {
                if (substr($campo["COLUMNS"]["Field"], -3) == "_id") {

                    $relaciones[] = Inflector::camelize(substr($campo["COLUMNS"]["Field"], 0, -3));
                }
            }

            $this->set('objetos', $relaciones);
            $db = ConnectionManager::getDataSource('default');
            $tablas = $db->listSources();
            $posibles = array();
            foreach ($tablas as $tabla) {
                $posibles[] = Inflector::camelize(Inflector::singularize($tabla));
            };

            $this->set('posiblesObjetos', array_diff($posibles, $relaciones));
        } else {

            $archivo = "<?php \n";
            $archivo.="class $objeto extends AppModel {\n";
            $archivo.="\n\t" . 'public $name="' . $objeto . '";';
            $belongsTo = "";
            if (!empty($this->data['belongsTo']))
                $belongsTo.="\n\t" . 'public $belongsTo=array(';

            foreach ($this->data['belongsTo'] as $key => $value) {
                $belongsTo.="'$key',";
            }
            if (!empty($this->data['belongsTo']))
                $belongsTo.=");\n";

//Ciclo para las demas relaciones
            $flaghasMany = 0;
            $hasMany.="\t" . 'public $hasMany=array(';
            $flaghasOne = 0;
            $hasOne.="\t" . 'public $hasOne=array(';
            foreach ($this->data['ObjectCreator'] as $key => $value) {

                if ($value != "No") {
                    $key = str_replace("ObjectCreator", "", $key);
                    if ($value == "hasMany") {
                        $flaghasMany = 1;
                        $hasMany.="'$key',";
                    }
                    if ($value == "hasOne") {
                        $flaghasOne = 1;
                        $hasOne.="'$key',";
                    }
                }
            }
            $hasOne.=");\n";
            $hasMany.=");\n";

            $archivo.=$belongsTo;
            if ($flaghasMany == 1) {
                $archivo.=$hasMany;
            }
            if ($flaghasOne == 1) {
                $archivo.=$hasOne;
            }
            $archivo.="\n} \n ?>";

            $rutaArchivo = APP . "Model" . DS . $objeto . ".php";

            $gestor = fopen($rutaArchivo, "w");
            if (fwrite($gestor, $archivo)) {
                fclose($gestor);
                $this->Session->setFlash('Objeto adicionado correctamente');
                $this->redirect(array('action' => 'index'));
            } else {
                $this->Session->setFlash('Error Adicionando objeto');
                $this->redirect(array('action' => 'index'));
            }
        }
    }

    function addAction($objeto) {
        $this->layout="registered";
        $this->set('objeto', $objeto);
// var_dump($this->data);
        if (empty($this->data)) {
            
        } else {
//Primero se obtiene el nombre de la funcion con sus respectivos parametros;
            $nombre = str_replace(' ', '_', $this->data ["ObjectCreator"]['nombre']);
            $set = "";
            $funcion = "";
            $conditions = "'conditions'=>array(";
            $nombreAccion = "function $nombre(";
            /*
             * En este ciclo se recoje el nombre del metodo y los parametros que recibe.
             * Asumimos que los parametros recibidos determinan las condiciones,
             * Tambien se envian los parametros recibidos a la vista.
             */

            if (!empty($this->data['Parametro'])) {
                foreach ($this->data['Parametro']as $key => $value) {
                    $nombreAccion.= "$" . $key . ",";
                    $set.="\t" . '$this->set(\'' . $key . '\',$' . $key . ');' . "\n";
                    $conditions.="'$objeto.$key'=>" . '$' . $key . ',';
                }
                $conditions.=")";
                $conditions = str_replace(",)", ")", $conditions);
            }
            $nombreAccion.=") ";
            $nombreAccion = str_replace(",)", ")", $nombreAccion);
            $listas = "";

            if (!empty($this->data['lista'])) {
                foreach ($this->data['lista'] as $value) {
                    $objetoLista = str_replace("_id", "", $value);
                    $objetoLista = Inflector::camelize($objetoLista);
                    $nombreLista = Inflector::pluralize($objetoLista);
                    $nombreLista[0] = strtolower($nombreLista[0]);
                    $listas.="\t" . '$this->set(\'' . $nombreLista . '\',' . '$this->' . $objeto . '->' . $objetoLista . '->find(\'list\') );' . "\n";
                }
            }

            /*
             * Ahora se crean los campos que se van a llamr en el find para el arreglo 'fields'
             */
            $fields = "'fields'=>array( ";
            foreach ($this->data['Campos'] as $key => $value) {

                foreach ($value as $val) {
                    $fields.="'$key.$val',";
                }
                $fields.="'$key.id',";
            }
            $fields.=")";
            $fields = str_replace(",)", ")", $fields);
            $find = "";
            if ($this->data['ObjectCreator']['tipo'] == "index") {
                $funcion.=$nombreAccion;
                $funcion.="{\n";
                $funcion.=$set;
                $nombreArray = Inflector::pluralize($objeto);
                $paginate = "\t" . '$this->paginate = array(\'' . $objeto . '\' => array(\'maxLimit\' => 500, \'limit\' => 50';
                ;



//$find = "\t" . '$this->set("'.$nombreArray.'",$this->' . $objeto . "->find('all',array(";

                if (!empty($this->data['Campos'])) {
                    $paginate.=',' . $fields;
                }



                $paginate.=" ) );\n";
                $paginate.= str_replace(",)", ")", $find);
                $paginate.="\t" . '$this->set(\'' . $nombreArray . '\',$this->paginate(';
                if (!empty($this->data['Parametro'])) {
                    $paginate.=str_replace("'conditions'=>", "", $conditions);
                }
                $paginate.="));\n";


                $funcion.=$paginate;
            }

            if ($this->data['ObjectCreator']['tipo'] == "edit") {
                $nombreAccion = "function $nombre(" . '$id' . ")";
                $funcion = $nombreAccion;
                $funcion.="{\n";
                $funcion.=$listas;
                $funcion.=$set;
                $find = '$this->data=$this->' . $objeto . "->find('first',array(";
                $find.="'conditions'=>array(" . "'$objeto.id'=>" . '$id' . "),";
                if (!empty($this->data['Campos'])) {
                    $find.=$fields . ",";
                }
                $find.=") );\n";
                $find = str_replace(",)", ")", $find);
                $funcion.="\t" . '$this->' . $objeto . '->recursive=-1;' . "\n";
                $funcion.="\t" . 'if(empty($this->data)){' . "\n\n";
                $funcion.="\t" . $find . "\n";
                $funcion.="\t" . "}else{\n\n"; //se cierra el if
                $funcion.="\t" . 'if(' . '$this->' . $objeto . '->save($this->data)){' . "\n";
                $funcion.="\t\t" . '$this->Session->setFlash(\'Registro editado correctamente\',\'flash_custom\');' . "\n";
                $funcion.="\t\t" . '$this->redirect(array( \'controller\'=>\'' . Inflector::camelize(Inflector::pluralize($objeto)) . "','action'=>'index')); " . "\n";
                $funcion.="\t" . "}else{\n";
                $funcion.="\t\t" . '$this->Session->setFlash(\'Error editando datos\');' . "\n";
                $funcion.="\t" . "}\n";
                $funcion.="\t" . "}\n";
            }
            if ($this->data['ObjectCreator']['tipo'] == "add") {

                $funcion.=$nombreAccion;
                $funcion.="{\n";
                $funcion.=$set;

                $find.=") );\n";
                $find = str_replace(",)", ")", $find);
                $funcion.=$listas;
                $funcion.="\t" . 'if(empty($this->data)){' . "\n\n";
                $funcion.="\t" . "\n";
                $funcion.="\t" . "}else{\n\n"; //se cierra el if
                $funcion.="\t" . 'if(' . '$this->' . $objeto . '->save($this->data)){' . "\n";
                $funcion.="\t\t" . '$this->Session->setFlash(\'Registro Adicionado correctamente\',\'flash_custom\');' . "\n";
                $funcion.="\t\t" . '$this->redirect(array( \'controller\'=>\'' . Inflector::camelize(Inflector::pluralize($objeto)) . "','action'=>'index')); " . "\n";
                $funcion.="\t" . "}else{\n";
                $funcion.="\t\t" . '$this->Session->setFlash(\'Error Guardando datos\');' . "\n";
                $funcion.="\t" . "}\n";
                $funcion.="\t" . "}\n";
            }


            $funcion.="\t" . "}\n"; //Se cierra la función
//Ahora se revisa si el  controlador ya existe.
            $nombreArchivo = Inflector::camelize(Inflector::pluralize($objeto));
            $rutaArchivo = APP . "Controller" . DS . $nombreArchivo . "Controller.php";
//caso en que el controlador aun no existe
            if (!file_exists($rutaArchivo)) {
                $texto = "<?php\n";
                $texto.="Class $nombreArchivo" . "Controller extends AppController {\n";
                $texto.="\t" . 'public $name' . "='$nombreArchivo';";
                $texto.="\n\n\t" . $funcion;
                $texto.="\n} ";
                $texto.="\n?>";

                $gestor = fopen($rutaArchivo, "w");
                if (fwrite($gestor, $texto)) {
                    $this->Session->setFlash('Acción adicionada correctamente');
                    $this->redirect(array('action' => 'actions_index', $objeto));
                    fclose($gestor);
                }
            } else {
////Si el controlador ya existe cargamos el texto en un array;
                $infile = "";
                $fp = fopen($rutaArchivo, 'r') or die("No se pudo abrir el archivo");
                while ($linea = fgets($fp, 1024)) {
                    $infile.=$linea;
                }
                fclose($fp);
                $infile = str_replace("<?php", "", $infile);
                $infile = str_replace("?>", "", $infile);
                $accion = str_replace(" ", "", $nombreAccion);
                $accion = str_replace("function", "", $accion);
                $txtfuncion = str_replace(" ", "", $infile);
                if (stristr($txtfuncion, $accion)) {
                    $this->Session->setFlash('Ya existe una acción con esta firma');
                    $this->redirect(array('action' => 'actions_index', $objeto));
                } else {
                    $funciones = explode('function', $infile);


                    $longitud = count($funciones);
                    $longitud . "<br>";
                    $funciones[$longitud] = $funciones[$longitud - 1];
                    $funciones[$longitud - 1];
                    $funciones[$longitud - 1] = str_replace("function", "", $funcion);
                    $infile = implode('function', $funciones);
                    $gestor = fopen($rutaArchivo, "w");
                    $infile = "<?php\n" . $infile . "\n?>";
                    if (fwrite($gestor, $infile)) {
                        $this->Session->setFlash('Acción adicionada correctamente');
                        $this->redirect(array('action' => 'actions_index', $objeto));
                        fclose($gestor);
                    } else {
                        
                    }
                }
            }
        }
    }

    function select($objeto) {
        $this->layout="registered";
        $this->set('objeto', $objeto);
        $tabla = Inflector::pluralize(Inflector::underscore($objeto));
        $campos = $this->ObjectCreator->query("DESCRIBE $tabla");
        foreach ($campos as $campo) {
            if (substr($campo["COLUMNS"]["Field"], -3) == "_id") {

                $relaciones[] = $campo["COLUMNS"]["Field"];
            }
        }


        if ($this->data['ObjectCreator']['tipo'] == 'edit') {

            $this->set('campos', $campos);
            $this->set('parametros', $relaciones);
        }
        if ($this->data['ObjectCreator']['tipo'] == 'index') {
            $this->set('campos', $campos);
            $this->set('parametros', $relaciones);
        }
        if ($this->data['ObjectCreator']['tipo'] == 'add') {
            $this->set('parametros', $relaciones);
        }
    }

    function views_index($objeto) {
        $this->set('objeto', $objeto);

        $directorio = Inflector::pluralize($objeto);
        $ruta = APP . "View" . DS . $directorio;
        if (!is_dir($ruta)) {
            if (!mkdir($ruta)) {
                $this->Session->setFlash('No se pudo crear el directorio');
            }
        }
        $directorio = opendir($ruta);
        $archivos = array();
        while ($archivo = readdir($directorio)) {
            $archivos[] = $archivo;
        }

        closedir($directorio);

        $this->set('archivos', $archivos);
    }

    function addViews($objeto) {
        $this->layout="default";
        $this->set('objeto', $objeto);
        $tabla = Inflector::pluralize(Inflector::underscore($objeto));
        if (empty($this->data)) {
            $funciones = $this->get_actions($objeto);
            $this->set('funciones', $funciones);
        } else {
            $funciones = $this->get_actions($objeto);
            $directorio = Inflector::pluralize($objeto);
            $nombreArchivo = Inflector::underscore($this->data['ObjectCreator']['nombre']);

            if ($funciones == 0) {
                $this->Session->setFlash('Es necesario primero crear un controlador');
                $this->redirect(array('action' => 'views_index', $objeto));
            } else {


                if ($this->data['ObjectCreator']['tipo'] == "index") {
                    $html = '<div class="paging">' . "\n" . "<?php\n";
                    $html.='echo $this->Paginator->options(array(\'update\' => \'#content\',\'evalScripts\' => false));';
                    $html.='echo $this->Paginator->prev(\'< \' . __(\'Anterior\'), array(), null, array(\'class\' => \'prev disabled\'));' . "\n";
                    $html.= 'echo $this->Paginator->numbers(array(\'separator\' => \'\'));' . "\n";
                    $html.= 'echo $this->Paginator->next(__(\'Siguiente\') . \' >\', array(), null, array(\'class\' => \'next disabled\'));' . "\n?>\n" . "</div>\n";


                    $html.= '<table>' . "\n";
                    $encabezado = "\t" . "<thead>" . "\n";
                    $encabezado.="\t" . "\t" . "<tr>" . "\n";
                    $cuerpo.= "\t" . '<tbody>' . "\n";
                    $cuerpo.='<?php foreach ( $' . Inflector::pluralize($objeto) . " as $" . "$objeto):?>\n";
                    $cuerpo.="\t" . "\t" . '<tr>' . "\n";




                    foreach ($this->data['Campos'] as $key => $dataObject) {
                        
                        
                        
                        foreach ($dataObject as $nombreCampo => $datos) {
                            if (isset($datos['check'])) {
                                
                                $cuerpo.="\t" . "\t" . '<td><?php echo $' . $objeto . "['$key']['$nombreCampo']; ?></td>\n";

                                $encabezado.="\t" . "\t" . '<th><?php echo $this->Paginator->sort(\'' . $key . '.' . $nombreCampo . '\',\'' . $datos['label'] . '\'); ?></th>' . "\n";
                            }
                        }
                    };
                    $controlador = Inflector::pluralize($objeto);
                    $cuerpo.="\t" . "\t" . '<td><?php echo $this->registered->link(\'editar\',' . "array('controller'=>'$controlador','action'=>'edit',$$objeto" . '["' . $objeto . '"]["id"]' . "),array('update'=>'content','indicator'=>'loading')); ?></td>\n";
                    $encabezado.="\t" . "\t" . '<th></th>' . "\n";



                    $cuerpo.="\t" . "\t" . '</tr>' . "\n";
                    $cuerpo.="<?php endforeach;?>\n";
                    $cuerpo.="\t</tbody>\n";
                    $encabezado.="\t" . "\t" . "</tr>" . "\n";
                    $encabezado.="\t" . "</thead>" . "\n";
                    $html.=$encabezado;
                    $html.=$cuerpo;
                    $html.="</table>\n";
                    $html.= '<?php echo $this->Js->writeBuffer();' . "?>\n";
                    $html.="\t" . "\t" . '<?php echo $this->registered->link(\'Adicionar\',' . "array('controller'=>'$controlador','action'=>'add'),array('update'=>'content','indicator'=>'loading')); ?>\n";
                } elseif ($this->data['ObjectCreator']['tipo'] == "add") {

                    $html = '<?php echo $this->Form->create("' . $objeto . '",array("class"=>"form",  "action"=>"' . $this->data['ObjectCreator']['nombre'] . '")); ?>' . "\n";
                    foreach ($this->data['Campos'] as $key => $dataObject) {
                        foreach ($dataObject as $nombreCampo => $datos) {

                            if (isset($datos['check'])) {
                                $opciones = "";
                                if (stristr($datos['Type'], "enum(")) {
                                    $opciones = ",'empty'=>'','options'=>array(";
                                    $enum = str_replace("enum(", "", $datos['Type']);
                                   // $enum = str_replace("'", "", $enum);
                                    $enum[strlen($enum)-1]=null;
                                    $enums = explode(',', $enum);
                                    foreach ($enums as $en) {
                                        $opciones.="$en => $en";
                                        $opciones.=",";
                                    }
                                    
                                    $opciones.=")";
                                    $opciones = str_replace("' ,)", "')", $opciones);
                                    $opciones = str_replace("'  => ", "'=>", $opciones);
                                }


                                $clase = "";
                                $tipo = "";
                                $jqueryFecha = "";
                                if ($datos['validacion'] == "fecha") {
                                    $clase = "calendario";
                                    if ($datos['obligatorio'] == 1) {
                                        $tipo = ", 'type'=>'required'";
                                    }
                                } elseif ($datos['validacion'] == "email") {
                                    $tipo = ",'type'=>'email' ";
                                    if ($datos['obligatorio'] == 1) {
                                        $clase = "required";
                                    }
                                } elseif ($datos['validacion'] == "numerico") {
                                    $tipo = ",'type'=>'number' ";
                                    if ($datos['obligatorio'] == 1) {
                                        $clase = "required";
                                    }
                                } elseif ($datos['validacion'] == "texto") {
                                    if ($datos['obligatorio'] == 1) {
                                        $clase = "required";
                                    }
                                }



                                $html.='<?php echo $this->Form->' . $datos['tipo'] . '(\'' . $key . '.' . $nombreCampo . "',array('label'=>'" . $datos['label'] . "','class' =>'$clase' $tipo  $opciones ));?>" . "\n";
                            }
                        }
                    };
                    $html.='<?php echo $this->Form->end("Guardar")?>' . "\n";
                } elseif ($this->data['ObjectCreator']['tipo'] == "edit") {

                    $html.='<?php echo $this->Form->create("' . $objeto . '",array("class"=>"form","action"=>"' . $this->data['ObjectCreator']['nombre'] . '")); ?>' . "\n";
                    foreach ($this->data['Campos'] as $key => $dataObject) {
                        $html.='<?php echo $this->Form->hidden(\'' . $key . '.' . 'id' . "' );?>" . "\n";
                        foreach ($dataObject as $nombreCampo => $datos) {

                            if (isset($datos['check'])) {
                                $clase = "";
                                $tipo = "";
                                $jqueryFecha = "";
                               $opciones = "";
                                if (stristr($datos['Type'], "enum(")) {
                                    $opciones = ",'empty'=>'','options'=>array(";
                                    $enum = str_replace("enum(", "", $datos['Type']);
                                   // $enum = str_replace("'", "", $enum);
                                    $enum[strlen($enum)-1]=null;
                                    $enums = explode(',', $enum);
                                    foreach ($enums as $en) {
                                        $opciones.="$en => $en";
                                        $opciones.=",";
                                    }
                                    
                                    $opciones.=")";
                                    $opciones = str_replace("' ,)", "')", $opciones);
                                    $opciones = str_replace("'  => ", "'=>", $opciones);
                                }




                                if ($datos['validacion'] == "fecha") {
                                    $clase = "calendario";
                                    if ($datos['obligatorio'] == 1) {
                                        $tipo = ",'type'=>'required'";
                                    }
                                } elseif ($datos['validacion'] == "email") {
                                    $tipo = ",'type'=>'email' ";
                                    if ($datos['obligatorio'] == 1) {
                                        $clase = "required";
                                    }
                                } elseif ($datos['validacion'] == "numerico") {
                                    $tipo = ",'type'=>'number' ";
                                    if ($datos['obligatorio'] == 1) {
                                        $clase = "required";
                                    }
                                } elseif ($datos['validacion'] == "texto") {
                                    if ($datos['obligatorio'] == 1) {
                                        $clase = "required";
                                    }
                                }



                                $html.='<?php echo $this->Form->' . $datos['tipo'] . '(\'' . $key . '.' . $nombreCampo . "',array('label'=>'" . $datos['label'] . "','class' =>'$clase' $tipo $opciones ));?>" . "\n";
                            }
                        }
                    };
                    $html.='<?php echo $this->Form->end("Guardar")?>' . "\n";
                }





                $ruta = APP . "View" . DS . $directorio . DS . $nombreArchivo . ".ctp";

                if (file_exists($ruta)) {
                    $this->Session->setFlash('Ya existe una vista con este nombre');
                    $this->redirect(array('action' => 'views_index', $objeto));
                } else {
                    $gestor = fopen($ruta, "w");
                    if (fwrite($gestor, $html)) {
                        $this->Session->setFlash('Vista adicionada correctamente');
                        $this->redirect(array('action' => 'views_index', $objeto));
                        fclose($gestor);
                    } else {
                        $this->Session->setFlash('Error');
                    }
                }
            }
        }
    }

    function select_view_type($objeto) {
        $this->layout="ajax";
        $this->set('objeto', $objeto);
        $tabla = Inflector::pluralize(Inflector::underscore($objeto));
        $campos = $this->ObjectCreator->query("DESCRIBE $tabla");
        $this->set('campos', $campos);
        $this->set('tipo', $this->data['ObjectCreator']['tipo']);
    }

    function get_actions($modelName) {
        $nombreArchivo = Inflector::camelize(Inflector::pluralize($modelName));
        $nombreArchivo = $nombreArchivo . "Controller";
        $rutaArchivo = APP . "Controller" . DS . $nombreArchivo . ".php";
        if (file_exists($rutaArchivo)) {

            $texto = "";
            $fp = fopen($rutaArchivo, 'r') or die("No se pudo abrir el archivo");
            while ($linea = fgets($fp, 1024)) {
                $texto.=$linea;
            }
            $texto = str_replace("<?php", "", $texto);
            $texto = str_replace("?>", "", $texto);

            $funciones = explode("function ", $texto);
            unset($funciones[0]);
            $nombreAcciones = array();
            foreach ($funciones as $funcion) {
                $funcion = explode('(', $funcion);
                $nombreAcciones[str_replace(" ", "", $funcion[0])] = str_replace(" ", "", $funcion[0]);
            }
            return $nombreAcciones;
        } else {
            return 0;
        }
    }

}

?>
